#ifndef __CBB_PH_YM_SLAVE_H__
#define __CBB_PH_YM_SLAVE_H__

#include "cbb_ph_obj.h"

// 最大重试次数
#define YM_MAX_RETRY 5

// Ymodem 状态机
enum YM_Status{
    YM_STATUS_IDLE,         // 空闲状态

    YM_STATUS_FILE_START,   // 开始传输文件
    YM_STATUS_FILE_ACK,     // 文件ACK响应
    YM_STATUS_FILE_NAK,     // 文件NAK响应

    YM_STATUS_DATA_ACK,     // 数据ACK响应
    YM_STATUS_DATA_NAK,     // 数据NAK响应

    YM_STATUS_EOT_NAK,      // 传输结束NAK响应
    YM_STATUS_EOT_ACK,      // 传输结束ACK响应

    YM_STATUS_END_ACK,      // 传输结束ACK响应
    YM_STATUS_END_NAK,      // 传输结束NAK响应
};

enum YM_Run{
    YM_IDLE,    // 空闲状态
    YM_RECV,    // 接收状态
    YM_SEND,    // 发送状态
};

// YMODEM SLAVE 对象
typedef struct PH_YM_Slave{

    uint16_t u16Tick;       // 时间计数器
    uint16_t u16Timeout;    // 超时时间
    uint8_t u8Retry;        // 重试次数
    uint8_t u8Run;          // 运行标志
    uint8_t u8Status;       // ymodem 状态

    void (*pfnErr)(void);                               // 错误回调函数
    void (*pfnData)(uint8_t *pu8Data, uint32_t u32Len); // 数据包回调函数
    void (*pfnEnd)(void);                               // 传输结束回调函数
}PH_YM_Slave_t;

/**
 * @brief 注册 ymodem slave 协议
 * @param pstSelf 协议上下文特征对象
 * @param fCheck 校验函数
 * @param fAppend 追加函数
 * @return PH_t* 协议对象
 */
PH_REG_DEC(cbb_ym_slave, PH_YM_Slave_t)

/**
 * @brief 监控 ymodem slave 协议
 * @param pstSelf 协议对象
 * @return @see PH_RET_t
 *
 * @note 超时监测
 */
PH_RET_t 
cbb_ym_slave_monitor(PH_t* pstSelf);

/**
 * @brief ymodem slave 协议启动传输
 * @param pstSelf 协议对象
 * @param pstTxBuffer 发送缓存
 * @return @see PH_RET_t
 */
PH_RET_t 
cbb_ym_slave_start(PH_t* pstSelf,PH_Buf_t* pstTxBuffer);

/**
 * @brief 构建 ymodem slave 构建报文
 * @param pstPHObj 协议对象
 * @param pstTxBuffer 发送缓存
 * @return @see PH_RET_t
 */
PH_RET_t 
cbb_ym_slave_build(PH_t* pstPHObj, PH_Buf_t* pstTxBuffer);

/**
 * @brief 解析 ymodem slave 解析报文
 * @param pstPHObj 协议对象
 * @param pstRxBuffer 接收缓存
 * @return @see PH_RET_t
 */
PH_RET_t 
cbb_ym_slave_parse(PH_t* pstSelf,PH_Buf_t* pstRxBuffer);

#endif /* __CBB_PH_YM_SLAVE_H__ */
